package course.examples.ContentProviders.StringContentProvider; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.database.MatrixCursor; import android.net.Uri; import android.util.SparseArray; // Note: Currently, this data does not persist across device reboot public class StringsContentProvider extends ContentProvider { // Data storage private static final SparseArray<DataRecord> db = new SparseArray<DataRecord>(); @SuppressWarnings("unused") private static final String TAG = "StringsContentProvider"; // Delete some or all data items @Override public synchronized int delete(Uri uri, String selection, String[] selectionArgs) { int numRecordsRemoved = 0; // If last segment is the table name, delete all data items if (isTableUri(uri)) { numRecordsRemoved = db.size(); db.clear(); // If last segment is the digit, delete data item with that ID } else if (isItemUri(uri)) { Integer requestId = Integer.parseInt(uri.getLastPathSegment()); if (null != db.get(requestId)) { db.remove(requestId); numRecordsRemoved++; } } //return number of items deleted return numRecordsRemoved; } // Return MIME type for given uri @Override public synchronized String getType(Uri uri) { String contentType = DataContract.CONTENT_ITEM_TYPE; if (isTableUri(uri)) { contentType = DataContract.CONTENT_DIR_TYPE; } return contentType; } // Insert specified value into ContentProvider @Override public synchronized Uri insert(Uri uri, ContentValues value) { if (value.containsKey(DataContract.DATA)) { DataRecord dataRecord = new DataRecord(value.getAsString(DataContract.DATA)); db.put(dataRecord.getID(), dataRecord); // return Uri associated with newly-added data item return Uri.withAppendedPath(DataContract.CONTENT_URI, String.valueOf(dataRecord.getID())); } return null; } // return all or some rows from ContentProvider based on specified Uri // all other parameters are ignored @Override public synchronized Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // Create simple cursor MatrixCursor cursor = new MatrixCursor(DataContract.ALL_COLUMNS); if (isTableUri(uri)) { // Add all rows to cursor for (int idx = 0; idx < db.size(); idx++) { DataRecord dataRecord = db.get(db.keyAt(idx)); cursor.addRow(new Object[] { dataRecord.getID(), dataRecord.getData() }); } } else if (isItemUri(uri)){ // Add single row to cursor Integer requestId = Integer.parseInt(uri.getLastPathSegment()); if (null != db.get(requestId)) { DataRecord dr = db.get(requestId); cursor.addRow(new Object[] { dr.getID(), dr.getData() }); } } return cursor; } // Ignore request @Override public synchronized int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; } // Initialize ContentProvider // Nothing to do in this case @Override public boolean onCreate() { return true; } // Does last segment of the Uri match a string of digits? private boolean isItemUri(Uri uri) { return uri.getLastPathSegment().matches("\\d+"); } // Is the last segment of the Uri the name of the data table? private boolean isTableUri(Uri uri) { return uri.getLastPathSegment().equals(DataContract.DATA_TABLE); } }